iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 5

30 天了解 Swift 的 Combine: [05] Publisher與 Subscriber 的 Lifecycle + 彈珠圖

  • 分享至 

  • xImage
  •  

Combine 之中, Publisher 是資料來源, Subscriber 是控制資料流的操作員, Subscriber 可以限制接收的資料信息量, 透過 Demand (需求), 使 Subscriber 得以在連接 Publisher 之後, 得到透過 Pipeline 處理後的資料.

Combine 同時使 Subscriber 可以取消(cancel) Demand 的要求, 在 Combine 里, 所有的 Subscriber 都具備 Cancelable, 每個 Subscriber 都可以透過 Cancel() 函式, 取消 Publisher 或 pipeline 的 連接.

因此, 我們可以知道 Publisher 是事件產生資料的單元, Pipeline 是轉換資料的單元, Subscriber 是控制 Publisher 週期的單元.

Publisher 與 Subscriber 的生命週期:

  1. Publisher 透過 .subscribe(Subscriber), 將指定的 Subscriber 連接在一起.

  2. Publisher 透過 Combine 的架構, 利用 subscriber.receive(subscription), 將 Publisher 與 subscriber 綁定在一起.

    • 在綁定事件成立之後, Subscriber 會 .request(_:Demand) 來接收 Publisher 的資料.
    • 同時, Publisher 可以透過 .received(_:Input) 的方式將資料給 Subscriber, 但是會將數量限制在 Subscriber 的 demand 之下.
    • Subscriber 可以在任何時候使用 .cancel()來結束綁定的生命週期.
  3. Publisher 可在錯誤產生時用 receive(completion:)做處理.

要特別注意的是, Publisher 是 Value type, Subscriber 是 Reference type, 還有一個特別 Subject, 是 Reference type, 目前還不會提到.

Marble Diagram

此外, 開始學習響應式編程時還有一個很重要的圖像要了解, 就是 彈珠圖 (Marble Diagram), 依照 Rx wiki的說明:

Marble diagrams are frequently in videos and blog entries from the Rx team explaining how certain operators in Rx work.

使用 Marble diagram 可以加快我們學習 Operator 的運作原理. 接下來介紹本篇主題所使用的符號:

// 這是註解
- //單位時間, 沒有特別寫會是 1 秒
X //Error 發生
| //代表 Complete normally
source: //表示事件來源
operat: //代表 operation 表示上流事件的轉換
output: //表示最後結果, 只有在 operation 之後才會出現

基本圖形範例

// Attach subscribtion then complete without notify
-------------------|

// Attach subscribtion then error occur before any notify
-------------------X

// Attach subscribtion then nothing happen yet
--------------------

經過 Operator 的圖形範例

1.
source: ------1------2------3---|

                map{$0 + 1}
                
output: ------2------3------4---|



2.
source: ------1------2------3---|

   filter{$0.isMultiple(of: 2)}
                
output: -------------2----------|

3. 

source: ------1------2------3---|

                map{$0 + 1}
                
operat: ------2------3------4---|

   filter{$0.isMultiple(of: 2)}
                
output: ------2-------------4---|

簡單測試:
1. 嘗試 google 並解釋 Subject 是什麼?
2. 解釋 .eraseToAnyPublisher() 幫助什麼.

whoami:
我是游諭 ytyubox


上一篇
30 天了解 Swift 的 Combine: [04] Combine初探, Publisher與 Subscriber
下一篇
30 天了解 Swift 的 Combine: [06] More Publisher, Just, Future, Promise
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言